Skip to content

feat: add headless t3 connect setup for SSH hosts#3749

Merged
juliusmarminge merged 14 commits into
mainfrom
t3code/ssh-connect-setup
Jul 19, 2026
Merged

feat: add headless t3 connect setup for SSH hosts#3749
juliusmarminge merged 14 commits into
mainfrom
t3code/ssh-connect-setup

Conversation

@t3dotgg

@t3dotgg t3dotgg commented Jul 6, 2026

Copy link
Copy Markdown
Member

What changed

  • Adds a one-command t3 connect flow that installs the relay client, authorizes the CLI, links the machine, and reports the connected account.
  • Adds browserless OAuth authorization for SSH/headless hosts. SSH sessions are detected automatically, --headless forces the flow, and users can press H during the normal flow to switch without restarting.
  • Lets users press Enter to launch the authorization URL during the normal browser flow.
  • Adds polished hosted /connect and /connect/callback screens for the browser-to-terminal handoff.
  • Offers an optional systemd user service with lingering so connected Linux hosts remain reachable after logout.
  • Makes install, repair, rollback, uninstall, runtime pinning, and hosted-origin validation fail safely.

Auth flow

The browserless path still uses OAuth Authorization Code + PKCE. The hosted link carries separate base64url state and S256 challenge fragment parameters; the callback returns a short-lived one-time code that the CLI validates and exchanges. The existing loopback browser flow remains available.

Verification

  • 52 focused server, web, and shared tests pass.
  • Targeted formatting, lint, and server/web typechecks pass.
  • Integrated browser verification covered app pairing, the hosted connect surface, Clerk sign-in launch, and ensuring the sign-in modal does not reopen after dismissal.
  • Manual end-to-end verification covered both loopback and headless authorization against a deployed personal infrastructure stage.

Deployment

Register the hosted callback origin used by the selected channel (for production, https://app.t3.codes/connect/callback) as an allowed redirect URI for the Clerk CLI OAuth client.

Note

Add headless t3 connect setup with out-of-band OAuth and systemd background service for SSH machines

  • Adds /connect and /connect/callback web routes that implement a browser-based PKCE OAuth flow for headless CLI authorization; the user copies a one-time code from the browser back to the terminal.
  • Extends CliTokenManager to detect SSH sessions (via SSH_CONNECTION/SSH_TTY) and fall back to out-of-band OAuth instead of launching a browser; get now returns a discriminated union {_tag:'Authorized'} | {_tag:'HeadlessRequested'}.
  • Introduces BootService in apps/server/src/cloud/bootService.ts to install, update, and uninstall a per-user systemd unit that keeps the relay running in the background; handles ephemeral npx/pnpm/bun cache paths by pinning a stable npm runtime.
  • Reworks the t3 connect CLI command to perform end-to-end setup: authorization (with headless fallback), relay readiness, cloud link configuration, optional background service installation via offerBootService, and user-facing status messaging.
  • Adds shared PKCE/OAuth utilities in packages/shared/src/connectAuth.ts covering URL construction, auth code encoding/validation, and scope constants.
  • Risk: CloudCliTokenManager.get now bubbles Terminal.QuitError to callers and may return HeadlessRequested instead of a token, requiring callers to handle the new union shape.

Macroscope summarized 26e6b3f.

t3dotgg and others added 6 commits July 6, 2026 03:22
Phase 1 of the headless `t3 connect` flow (.plans/t3-connect-remote-setup.html).

The CLI's OAuth login hardcodes a 127.0.0.1 loopback redirect, which cannot
work on a machine reached over SSH. These hosted pages give the CLI an
out-of-band leg for the same Clerk PKCE flow:

- /connect reads state + code_challenge from the URL fragment, waits for a
  Clerk session, and forwards to Clerk's authorize endpoint.
- /connect/callback shows the account being connected plus a one-time
  code.state blob to paste back into the waiting terminal, refusing to
  render codes for requests this browser did not start.

Both routes bounce to / unless running as the hosted static app, since the
same bundle ships inside local instances. The fragment carries no secrets;
the PKCE verifier never leaves the CLI box, so an observed code cannot be
exchanged. packages/shared/connectAuth.ts holds the URL/blob codecs shared
with the CLI side, and VITE_CLERK_CLI_OAUTH_CLIENT_ID exposes the existing
CLI OAuth client id to the web build.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Phase 2 of the headless connect flow (.plans/t3-connect-remote-setup.html).

CliTokenManager gains pasteCodeLogin: it generates the same PKCE
verifier/challenge/state as the loopback flow, prints a hosted
app.t3.codes/connect URL instead of binding 127.0.0.1:34338, and exchanges
the pasted code.state blob (validating state to keep the CSRF check). The
prompt is injected by the caller so the flow is testable without a TTY.

`t3 connect` (bare) now runs the whole setup — relay client install,
authorization, desired-link flag — instead of requiring login + link as
separate steps. Paste mode is auto-selected inside SSH sessions
(SSH_CONNECTION/SSH_TTY) and available anywhere via --paste; desktop
keeps the loopback browser flow unchanged. T3CODE_HOSTED_APP_URL
overrides the hosted origin for staging.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Phase 3 of the headless connect flow (.plans/t3-connect-remote-setup.html).

After linking, `t3 connect` asks whether T3 Code should run in the
background whenever the machine boots. Saying yes installs a systemd user
unit running `t3 serve`, enables it immediately, and runs
`loginctl enable-linger` so the service survives SSH logout and reboots.
Linux-only for now; other platforms get a clear skip message.
`t3 connect logout` removes the unit again.

Because systemd user units run with a minimal environment and fail
invisibly, the unit uses only absolute paths (node binary + entry point)
and appends service output and install failures to a log file whose path
is printed at setup time. When the CLI is running out of the ephemeral
npx cache, the exact running version is first pinned via
`npm install --prefix` into ~/.t3/runtime/versions/<v> — a real install
(t3 ships native deps like node-pty), and never `npx t3@latest` in the
unit, which would make boot depend on the npm registry.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review round on the headless-connect branch, focused on simplicity and
reliability. Reliability fixes:

- Boot service: quote/escape systemd unit values (paths with spaces or
  percents produced word-split ExecStart lines); drop the inert
  After=network-online.target (not a user-manager unit); add
  WorkingDirectory=%h so boot-started servers don't run from /; run
  `loginctl enable-linger` without a username ($USER can be stale or
  unset); give the pinned npm install a 10-minute timeout (default 60s
  killed healthy node-pty builds) and record success with a sentinel,
  removing the half-installed tree on failure so retries don't enable a
  crashlooping service; detect pnpm dlx / bunx caches as ephemeral, not
  just npx.
- BootService.status now reports supported/current: connect no longer
  prompts on platforms where install can only fail, offers a repair when
  the installed unit is stale (old runtime path after an upgrade), and a
  boot-service failure warns instead of failing the whole command after
  connect already succeeded. uninstall reports whether it removed a unit
  and logout no longer pre-checks status (a status error used to silently
  skip removal).
- Paste flow: a stored credential whose refresh fails now falls through
  to a fresh sign-in instead of dead-ending the command, and the paste
  prompt gets the same 10-minute timeout as the loopback flow.
- Callback page: read the expected state without deleting it —
  consume-on-render was eaten by StrictMode's double render, disabling
  the CSRF check; add a Sign in button for a dismissed Clerk modal.

Simplicity/duplication fixes: single DEFAULT_HOSTED_APP_URL and
readHashParams in packages/shared; the loopback flow now builds its
authorize URL with the shared builder; one checkConnectAuthCode used by
both the prompt validation and the authoritative re-check; shared
AuthSurfaceShell for the pairing/connect pages; route gating moved to
cloud/connectCliAuth (routes no longer import from each other);
detectHeadlessSession reads HostProcessEnvironment; dropped the
duplicated cliVersion on BootServiceHost and unused exports.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…talls

Round-2 review fixes, each verified against a live systemd user manager:

- `systemctl --user enable --now` does not replace an already running
  process, so repairing a stale unit swapped the file but kept the old
  server running until reboot. Split into enable + restart.
- StandardOutput=append: paths go through systemd specifier expansion but
  must not be quoted; a `%` in the home path broke standard-output setup
  and killed the service. Escape % (only) in the append paths.
- If an activation step failed after the unit file was written, the next
  `t3 connect` saw the file and reported the service as already set up
  even though enable/linger never ran. Remove the unit again when
  activation fails so the retry actually repairs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ot-service edges

Fixes from three independent Fable review agents (general / simplify /
over-engineering) on the whole branch.

Security:
- The paste flow links whichever account completed the browser auth, and
  the callback page previously failed open (no recorded state) and labeled
  the code with the local session's account. An attacker who saw a victim's
  printed URL could get the victim to link their machine to the attacker's
  account. Two mitigations: the callback now fails closed (a missing or
  mismatched state is refused, not displayed), and the CLI prints the
  account it actually linked ("Connected as theo@…") by reading the OIDC
  id_token, so account substitution is visible before the machine comes
  online — matching the original plan's mockup.

Correctness/UX:
- Loopback `t3 connect` now falls through to a fresh login when the stored
  credential can't be refreshed, instead of dead-ending — the desktop
  counterpart of the paste-side fallback.
- Ctrl-C / EOF at the paste prompt propagates as QuitError (quiet cancel)
  instead of being wrapped into an authorization-error dump.

Boot service:
- `current` now also requires the unit's entry point to exist, so a deleted
  pinned runtime triggers a repair instead of "already set up".
- Failed activation rolls back with disable + remove + daemon-reload (was
  remove only), so no dangling enable symlink or stale definition survives.
- Add StartLimitIntervalSec/Burst so a persistently broken service stops
  instead of restarting every 5s forever and growing the append log.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 6, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: f9923f81-dd1e-47bc-9632-dbf5a9474aa3

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/ssh-connect-setup

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Jul 6, 2026
Comment thread apps/web/src/components/cloud/ConnectCliAuthSurface.tsx
Comment thread apps/web/src/cloud/connectCliAuth.ts
Comment thread apps/server/src/cloud/bootService.ts
Comment thread apps/server/src/cli/connect.ts Outdated
Comment thread apps/server/src/cli/connect.ts Outdated
Comment thread apps/server/src/cloud/bootService.ts Outdated
Comment thread apps/server/src/cloud/bootService.ts
Comment thread apps/server/src/cloud/publicConfig.ts
Comment thread apps/server/src/cloud/bootService.ts Outdated
Comment thread packages/shared/src/connectAuth.ts
@macroscopeapp

macroscopeapp Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a significant new feature (headless SSH connect flow) with new OAuth authentication paths, systemd service management, and new web routes. The scope and nature of changes—particularly the auth flows and system service installation—warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@t3dotgg t3dotgg changed the title Add headless t3 connect setup for SSH boxes wip: add headless t3 connect setup for SSH boxes Jul 6, 2026
@t3dotgg t3dotgg changed the title wip: add headless t3 connect setup for SSH boxes feat: add headless t3 connect setup for SSH boxes (WIP) Jul 14, 2026
Co-authored-by: codex <codex@users.noreply.github.com>

# Conflicts:
#	apps/server/src/cli/connect.ts

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review found four issues: three uses of Effect.catchTag that should be Effect.catchTags, and a BootServiceCommandError that discards its underlying cause and derives its message from copied cause.message/raw command output. See inline comments.

Posted via Macroscope — Effect Service Conventions

Comment thread apps/server/src/cloud/bootService.ts
Comment thread apps/server/src/cli/connect.ts
Comment thread apps/server/src/cli/connect.ts
Comment thread apps/server/src/cloud/CliTokenManager.ts
Co-authored-by: codex <codex@users.noreply.github.com>
Comment thread apps/server/src/cloud/bootService.ts Outdated
juliusmarminge and others added 2 commits July 19, 2026 12:44
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One Effect convention issue found in the out-of-band OAuth flow. Prior findings (catchTag usages and the BootServiceCommandError detail field) have all been resolved.

Posted via Macroscope — Effect Service Conventions

Comment thread apps/server/src/cloud/CliTokenManager.ts Outdated

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 3 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c3203af. Configure here.

Comment thread apps/server/src/cli/connect.ts Outdated
Comment thread apps/server/src/cli/connect.ts Outdated
Comment thread apps/web/src/components/cloud/ConnectCliAuthSurface.tsx Outdated

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One Effect convention issue found in the out-of-band OAuth flow. Prior findings (catchTag usages and the BootServiceCommandError detail field) have all been resolved.

Posted via Macroscope — Effect Service Conventions

Comment thread apps/server/src/cloud/CliTokenManager.ts Outdated
Co-authored-by: codex <codex@users.noreply.github.com>
Comment thread apps/server/src/cloud/bootService.ts
juliusmarminge and others added 3 commits July 19, 2026 16:05
- Add browser-assisted OAuth with headless fallback
- Improve CLI and web authorization surfaces
- Add branded completion HTML and focused tests
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
@juliusmarminge juliusmarminge changed the title feat: add headless t3 connect setup for SSH boxes (WIP) feat: add headless t3 connect setup for SSH hosts Jul 19, 2026
@juliusmarminge
juliusmarminge merged commit 7a820ab into main Jul 19, 2026
16 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/ssh-connect-setup branch July 19, 2026 16:59
cursor Bot pushed a commit to aaditagrawal/t3code that referenced this pull request Jul 20, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
(cherry picked from commit 7a820ab)
cursor Bot pushed a commit to aaditagrawal/t3code that referenced this pull request Jul 20, 2026
…ingdotgg#3749, pingdotgg#4159) (#172)

* [codex] Route OpenCode missing-session errors through Effect (pingdotgg#3608)

Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
(cherry picked from commit d0b9f8d)

* [codex] canonicalize client timestamps (pingdotgg#4112)

(cherry picked from commit da3c203)

* fix: increase OpenCode server startup timeout from 5s to 30s (pingdotgg#4132)

(cherry picked from commit 398140a)

* fix(shared): delete unused agentAwareness phase predicates (pingdotgg#4134)

(cherry picked from commit e8ff6bc)

* perf(client): defer active thread cache writes (pingdotgg#4006)

(cherry picked from commit 765e1b5)

* fix(client): use lightweight connection probe (pingdotgg#4137)

(cherry picked from commit 2640e6d)

* fix(client): adapt deferred thread cache tests for fork warm-cache

Fork warm-cache seeding stays on synchronizing and must not re-persist
active turns. Gate the seed persistence write with shouldPersistThread
and drive the pingdotgg#4006 regression test to live via a socket snapshot.

Co-authored-by: aaditagrawal <aaditagrawal@users.noreply.github.com>

* feat(web): themed sidebar header art for nightly and dev builds (pingdotgg#4130)

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
(cherry picked from commit 53e3c98)

* feat: add headless `t3 connect` setup for SSH hosts (pingdotgg#3749)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
(cherry picked from commit 7a820ab)

* Refine T3 Connect authorization surfaces (pingdotgg#4159)

Co-authored-by: codex <codex@users.noreply.github.com>
(cherry picked from commit 2b180a2)

---------

Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Maxwell Young <maxtheyoung@gmail.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Kriday Dave <technocratix902@gmail.com>
Co-authored-by: Chris Michael Guzman <67719167+Chrrxs@users.noreply.github.com>
Co-authored-by: eeinarsson <128746408+eeinarsson@users.noreply.github.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: aaditagrawal <aaditagrawal@users.noreply.github.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@users.noreply.github.com>
adamfgr pushed a commit to agriffiths-bots/t3code that referenced this pull request Jul 20, 2026
* Add isolated app testing workflow (pingdotgg#4121)

Co-authored-by: codex <codex@users.noreply.github.com>

* feat(web): themed sidebar header art for nightly and dev builds (pingdotgg#4130)

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>

* feat: add headless `t3 connect` setup for SSH hosts (pingdotgg#3749)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* Refine T3 Connect authorization surfaces (pingdotgg#4159)

Co-authored-by: codex <codex@users.noreply.github.com>

* fix: increase OpenCode server startup timeout from 5s to 30s (pingdotgg#4132)

* fix(shared): delete unused agentAwareness phase predicates (pingdotgg#4134)

* fix(mobile): Stabilize native stack option updates (pingdotgg#4037)

Co-authored-by: codex <codex@users.noreply.github.com>

* Make test-t3-app skill discoverable by Claude Code (pingdotgg#4162)

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

* fix(web): improve dev sidebar backdrop contrast & remove version pills (pingdotgg#4166)

* Fix draft banner stack overlap (pingdotgg#4164)

Co-authored-by: codex <codex@users.noreply.github.com>

* Add portable mobile app testing guidance (pingdotgg#4165)

Co-authored-by: codex <codex@users.noreply.github.com>

* fix(client): use lightweight connection probe (pingdotgg#4137)

---------

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Kriday Dave <technocratix902@gmail.com>
Co-authored-by: eeinarsson <128746408+eeinarsson@users.noreply.github.com>
DanielGGordon added a commit to DanielGGordon/t3code that referenced this pull request Jul 24, 2026
* Use rounded depth logo for production splash screen (pingdotgg#3780)

Co-authored-by: Cursor Agent <cursoragent@cursor.com>

* fix(release): stage pnpm 11 allowBuilds for desktop installs (pingdotgg#3781)

Co-authored-by: Cursor Agent <cursoragent@cursor.com>

* Upgrade Clerk toolchain to latest versions (pingdotgg#3785)

* fix(release): bump electron-builder so pnpm 11 deduped deps land in the asar (pingdotgg#3790)

* Fix desktop native optional dependency packaging (pingdotgg#3816)

* [codex] Upgrade Clerk stack (pingdotgg#3821)

Co-authored-by: codex <codex@users.noreply.github.com>

* [codex] Preserve worktree metadata during branch sync (pingdotgg#3822)

Co-authored-by: codex <codex@users.noreply.github.com>

* feat(client): persist offline environment data and mobile preferences (pingdotgg#3795)

Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: codex <codex@users.noreply.github.com>

* [codex] Label max and ultra reasoning (pingdotgg#3824)

Co-authored-by: codex <codex@users.noreply.github.com>

* fix(mobile): embed fonts and render project favicons reliably (pingdotgg#3823)

Co-authored-by: codex <codex@users.noreply.github.com>

* Show compact PR number badges in mobile thread rows (pingdotgg#3827)

Co-authored-by: codex <codex@users.noreply.github.com>

* Expose mobile PR indicator labels to accessibility (pingdotgg#3828)

Co-authored-by: codex <codex@users.noreply.github.com>

* Fix truncated chat error alert layout (pingdotgg#3899)

* fix(marketing): show platform-appropriate commit shortcut on the website (pingdotgg#3644)

* [codex] Add Android mobile support (pingdotgg#3579)

Co-authored-by: Horus Lugo <horusgoul@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: maria-rcks <maria@kuuro.net>
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: Ben Davis <45952064+bmdavis419@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius@mac.lan>

* Use client-side fallbacks for missing project favicons (pingdotgg#3959)

* Skip stale working-task notifications (pingdotgg#3961)

* Prepare Android beta branding and review diff UI (pingdotgg#3967)

* perf(web): duty-cycle status animations and remove fixed noise overlay (pingdotgg#3978)

* fix(docs): correct CI task-runner commands in ci.md (pingdotgg#3990)

* fix(docs): repair broken source links in architecture overview (pingdotgg#3991)

* fix(docs): replace stale codething-mvp absolute paths with repo-relative links (pingdotgg#3992)

* docs: Add T3 Code Legal Docs (pingdotgg#3972)

Co-authored-by: codex <codex@users.noreply.github.com>

* Fix Legal modal header crash (pingdotgg#4000)

Co-authored-by: codex <codex@users.noreply.github.com>

* [codex] Fix onboarding connection status (pingdotgg#4001)

Co-authored-by: codex <codex@users.noreply.github.com>

* Isolate native diff highlight grammar state (pingdotgg#4029)

* Fix macOS fullscreen titlebar spacing (pingdotgg#4019)

* Prevent duplicate project workspace roots (pingdotgg#3829)

Co-authored-by: codex <codex@users.noreply.github.com>

* Normalize over-indented markdown list items (pingdotgg#4020)

Co-authored-by: codex <codex@users.noreply.github.com>

* Resolve localhost preview URLs for remote environments (pingdotgg#4011)

Co-authored-by: codex <codex@users.noreply.github.com>

* fix(mobile): Send composer images in upload wire format (pingdotgg#4035)

* Fix iOS terminal Enter input encoding (pingdotgg#4043)

* Add native mobile share target support (pingdotgg#4021)

Co-authored-by: codex <codex@users.noreply.github.com>

* [codex] Expand real-route app store screenshot harness (pingdotgg#4014)

Co-authored-by: codex <codex@users.noreply.github.com>

* fix(server): use CLAUDE_CONFIG_DIR instead of HOME for Claude instanc… (pingdotgg#4017)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* Fix dropped events during initial thread snapshot (pingdotgg#4079)

* feat: show nightly update changelog tooltip (pingdotgg#3832)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* fix(git): treat selected commit paths literally (pingdotgg#3998)

* fix(server): stabilize non-repository Git diagnostics (pingdotgg#4077)

* Refresh app icons across release variants (pingdotgg#4080)

Co-authored-by: codex <codex@users.noreply.github.com>

* Update marketing GitHub star count (pingdotgg#4088)

* fix(marketing): correct Cursor icon color (pingdotgg#4090)

* Normalize protocol-relative remote host input as https (pingdotgg#3971)

* fix(cursor): default binary path to cursor-agent (avoid path conflict w/ grok) (pingdotgg#4094)

* Fix documented task-runner commands (bun run -> vp) (pingdotgg#3965)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* Allow preview panel to grow on wide displays (pingdotgg#4044)

* fix: prevent initial right-click from selecting a context menu item (pingdotgg#3877)

* Fix duplicate keybinding rule when replacing with an existing rule (pingdotgg#3969)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* fix(server): image upload crashed dispatchCommand with a stack overflow (pingdotgg#3952)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>

* Remove unused code parameter from describePreviewError (pingdotgg#3970)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>

* [codex] prevent ACP assistant ID collisions after restarts (pingdotgg#3932)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* fix(web): inset Windows desktop scrollbars from resize edge (pingdotgg#4097)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>

* [codex] fix mobile composer Enter behavior (pingdotgg#3930)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* feat(server): include runtime model and effort in Codex developer instructions (pingdotgg#3948)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>

* fix(ux): spamming cmd + , no longer stack opening settings (pingdotgg#2757)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* fix(terminal): strip AppImage runtime env from spawned terminals (pingdotgg#3108)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* fix(server): thread cwd through Claude capability probe (pingdotgg#2048) (pingdotgg#2124)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* [codex] fix: guard invalid web timestamps (pingdotgg#3515)

Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>

* [codex] fix: tolerate invalid latest user message timestamps (pingdotgg#3521)

Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>

* [codex] Fix provider update checks restore defaults (pingdotgg#3531)

Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>

* fix(server): skip undecodable provider runtime rows when listing sessions (pingdotgg#3951)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* Share MCP OAuth locks across Codex shadow homes (pingdotgg#4104)

* Preserve T3 Code identity in macOS development launcher (pingdotgg#4102)

* fix(web): increase contrast of question option descriptions (pingdotgg#3867)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>

* feat: draft hero landing on the index route (pingdotgg#4055)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>

* feat: file explorer mention actions and zoom-aware context menus (pingdotgg#4054)

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>

* fix(web): avoid duplicate mention text on paste

Co-authored-by: codex <codex@users.noreply.github.com>

* fix(mobile): restore iOS home screen branding (pingdotgg#4025)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* perf(client): defer active thread cache writes (pingdotgg#4006)

* Default diffs to working changes (pingdotgg#3974)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* Add Grok to marketing site provider list (pingdotgg#3484)

* Fix reopening existing Diff tab (pingdotgg#3973)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* Fix sending messages during active turns (pingdotgg#3919)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* [codex] Route OpenCode missing-session errors through Effect (pingdotgg#3608)

Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>

* [fix/feat:ui] Show default option badge (pingdotgg#3232)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* [fix/feat:ui] Preserve open-in editor brand colors (pingdotgg#3225)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* fix(web): handle macOS Home and End in composer (pingdotgg#2508)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* Allow failed remote environments to be removed (pingdotgg#4084)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* [codex] canonicalize client timestamps (pingdotgg#4112)

* [fix/feat:ui] Make selected menu checks blue (pingdotgg#3234)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* fix(desktop): Validate WSL node version against engine range after probe success (pingdotgg#3621)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* Refresh splash screen and favicon branding (pingdotgg#4120)

* Add terminal selection copy action (pingdotgg#2904)

* Add isolated app testing workflow (pingdotgg#4121)

Co-authored-by: codex <codex@users.noreply.github.com>

* feat(web): themed sidebar header art for nightly and dev builds (pingdotgg#4130)

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>

* feat: add headless `t3 connect` setup for SSH hosts (pingdotgg#3749)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* Refine T3 Connect authorization surfaces (pingdotgg#4159)

Co-authored-by: codex <codex@users.noreply.github.com>

* fix: increase OpenCode server startup timeout from 5s to 30s (pingdotgg#4132)

* fix(shared): delete unused agentAwareness phase predicates (pingdotgg#4134)

* fix(mobile): Stabilize native stack option updates (pingdotgg#4037)

Co-authored-by: codex <codex@users.noreply.github.com>

* Make test-t3-app skill discoverable by Claude Code (pingdotgg#4162)

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

* fix(web): improve dev sidebar backdrop contrast & remove version pills (pingdotgg#4166)

* Fix draft banner stack overlap (pingdotgg#4164)

Co-authored-by: codex <codex@users.noreply.github.com>

* Add portable mobile app testing guidance (pingdotgg#4165)

Co-authored-by: codex <codex@users.noreply.github.com>

* fix(client): use lightweight connection probe (pingdotgg#4137)

* fix(server): resolve Claude SDK executable path on Windows npm installs (pingdotgg#3740)

* Fix project action preview settings persistence (pingdotgg#3842)

* fix(desktop): allow clipboard writes in the preview browser (pingdotgg#3889)

* fix(web): handle sidebar shortcut before editors (pingdotgg#3921)

* fix(server): recognize Bedrock-backed Claude as authenticated (pingdotgg#3931)

* Fix incorrect pluralization of “entry” (pingdotgg#3933)

* feat(server): title background-task work-log rows with the task name (pingdotgg#3751)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix: delegate OpenCode session titles to provider (pingdotgg#3720)

* Archive selected threads from the context menu (pingdotgg#3895)

* fix(cli): support force removing projects (pingdotgg#3922)

* fix: allow sidebar to be shrunk when wider than viewport (pingdotgg#2456)

Co-authored-by: Shoaib Ansari <shoaibansari@Shoaibs-Mac-mini.local>
Co-authored-by: Julius Marminge <julius0216@outlook.com>

* fix(codex): show web search query and url in tool call details (pingdotgg#2093)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* Add Codex launch arguments setting (pingdotgg#2892)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: root <root@localhost.localdomain>

* [orchestration] Clear stale active turn when session becomes inactive (pingdotgg#3159)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* Regenerate Codex reset credit protocol bindings (pingdotgg#4173)

Co-authored-by: codex <codex@users.noreply.github.com>

* fix(preview): preserve direct localhost navigation (pingdotgg#3939)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* Synchronize mobile threads with authoritative shell snapshots (pingdotgg#4163)

Co-authored-by: codex <codex@users.noreply.github.com>

* Gate iOS glass layout on native support (pingdotgg#4032)

Co-authored-by: codex <codex@users.noreply.github.com>

* fix(opencode): resume the OpenCode session on follow-ups instead of starting an empty one (pingdotgg#3617)

Co-authored-by: codex <codex@users.noreply.github.com>

* fix(server): use CLI for OpenCode health check instead of spawning server (pingdotgg#4153)

* fix(web): scope timeline minimap hover target to the side gutter (pingdotgg#3869)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* [codex] show complete approval details (pingdotgg#4111)

* fix(web): paint text selection over composer chips (pingdotgg#4139)

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>

* [codex] preserve custom model slugs (pingdotgg#4168)

* fix(web): preview workspace images in the file panel (pingdotgg#3996)

Co-authored-by: Rhiz3K <rhiz3k@protonmail.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>

* feat(web): drag files from the explorer into the chat composer (pingdotgg#4140)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>

* fix(desktop): preserve main window bounds (pingdotgg#3851)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>

* perf(orchestration): speed up new-chat propagation and offline catch-up (pingdotgg#4177)

Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>

* Finale: upgrade changed files card to fix various UI issues (pingdotgg#4113)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* Pass CLI OAuth config to hosted web deploy (pingdotgg#4186)

Co-authored-by: codex <codex@users.noreply.github.com>

* fix(web): always show environment chip for remote projects (pingdotgg#4217)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(web): keep composer editable while disconnected (pingdotgg#4241)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix: better defaults — Claude 1M context, Codex gpt-5.6, worktrees from origin main (pingdotgg#4240)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(claude): handle all SDK stream messages; stop spurious work-log warning rows (pingdotgg#4244)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

---------

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Rowan <rowan@cardow.co>
Co-authored-by: Patricio Gómez Meneses <107218376+Prgm-code@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: Jake Leventhal <jakeleventhal@me.com>
Co-authored-by: Vedank Purohit <VedankPurohit2@gmail.com>
Co-authored-by: Horus Lugo <horusgoul@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: maria-rcks <maria@kuuro.net>
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: Ben Davis <45952064+bmdavis419@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Kriday Dave <technocratix902@gmail.com>
Co-authored-by: Ishan <ishansachu1@gmail.com>
Co-authored-by: Dimitar Stoykov <mitkostoikov1988@gmail.com>
Co-authored-by: Hugo Vizcaino Santana <42343504+HugoVizcainoSantana@users.noreply.github.com>
Co-authored-by: Eric Tsai <52527831+EricTsai83@users.noreply.github.com>
Co-authored-by: Manuel De Ceglie <80224270+AmoonPod@users.noreply.github.com>
Co-authored-by: BunnyGamezsc <146652788+BunnyGamezsc@users.noreply.github.com>
Co-authored-by: Olivier Melcher <olivier.melcher@gmail.com>
Co-authored-by: Fazal Kadivar <fazalkadivar7@gmail.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Maxwell Young <maxtheyoung@gmail.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: James <105842516+jamesx0416@users.noreply.github.com>
Co-authored-by: Leonel Rivas <herial_vi@icloud.com>
Co-authored-by: Matt Van Horn <mvanhorn@users.noreply.github.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: xxashxx-svg <xxanshxx9@gmail.com>
Co-authored-by: Yordis Prieto <yordis.prieto@gmail.com>
Co-authored-by: Chris Michael Guzman <67719167+Chrrxs@users.noreply.github.com>
Co-authored-by: Aditya Mer <101453576+Aditya190803@users.noreply.github.com>
Co-authored-by: ss <69873514+sandersonstabo@users.noreply.github.com>
Co-authored-by: Guilherme Vieira <46866023+GuilhermeVieiraDev@users.noreply.github.com>
Co-authored-by: Noah Zepner <noah@zepner.dev>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Taras <Taras.Fomin@gmail.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: eeinarsson <128746408+eeinarsson@users.noreply.github.com>
Co-authored-by: David Whatley <nsxdavid@gmail.com>
Co-authored-by: coach007 <6238600+keeperxy@users.noreply.github.com>
Co-authored-by: Carlos Rico-Ospina <carlosricojr@gmail.com>
Co-authored-by: Andrew Barnes <bortstheboat@gmail.com>
Co-authored-by: Pieter van Zyl <20579513+PieterVanZyl-Dev@users.noreply.github.com>
Co-authored-by: mel <mcmelon@nodiumhosting.com>
Co-authored-by: Tristan Knight <tris203@gmail.com>
Co-authored-by: Christoph Herzog <a.github@omega-id.com>
Co-authored-by: Shoaib <shoaib050326@gmail.com>
Co-authored-by: Shoaib Ansari <shoaibansari@Shoaibs-Mac-mini.local>
Co-authored-by: root <root@localhost.localdomain>
Co-authored-by: Andrew Forster <76947376+Andrew-Forster@users.noreply.github.com>
Co-authored-by: Vadym Kotai <vdmkotai@gmail.com>
Co-authored-by: Rhiz3K <33246262+Rhiz3K@users.noreply.github.com>
Co-authored-by: Rhiz3K <rhiz3k@protonmail.com>
Co-authored-by: Anirudh Coontoor <me@anirudhs.net>
Co-authored-by: Rusiru Sadathana <rusirusadathana@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL 1,000+ changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants